"""
可视化API路由
"""
from flask import Blueprint, jsonify
from app.api.analysis.services import AnalysisService
from app.api.viz.kmeans import generate_kmeans_visualizations
from app.api.viz.linear_regression import generate_linear_regression_visualizations
import numpy as np
import logging

bp = Blueprint('viz', __name__, url_prefix='/api/viz')


@bp.route('/kmeans/<int:task_id>', methods=['GET'])
def kmeans_visualization(task_id):
    """
    生成K-means聚类的可视化图表
    
    Args:
        task_id: 分析任务ID
        
    Returns:
        dict: 包含所有可视化图表的base64字符串
    """
    try:
        # 获取分析任务
        task = AnalysisService.get_task(task_id)
        if not task:
            return jsonify({'error': '任务不存在'}), 404

        if task.task_type != 'kmeans':
            return jsonify({'error': '任务类型不是K-means聚类'}), 400

        # 获取分析结果
        result = task.result
        if not result:
            return jsonify({'error': '分析结果不存在'}), 404

        # 转换数据格式
        try:
            scaled_data = np.array(result['scaled_data'], dtype=np.float64)
            labels = np.array(result['labels'], dtype=np.int64)
            cluster_centers = np.array(result['centroids'], dtype=np.float64)
        except Exception as e:
            logging.error(f"数据格式转换失败: {str(e)}")
            return jsonify({'error': '数据格式转换失败'}), 500

        # 获取数据集
        dataset = task.dataset
        if not dataset:
            return jsonify({'error': '数据集不存在'}), 404

        numeric_cols = dataset.get_numeric_columns()
        if not numeric_cols:
            return jsonify({'error': '无法获取数值型列名'}), 500

        # 生成可视化
        try:
            visualizations = generate_kmeans_visualizations(
                scaled_data=scaled_data,
                labels=labels,
                cluster_centers=cluster_centers,
                numeric_cols=numeric_cols
            )
            return jsonify(visualizations)
        except Exception as e:
            logging.error(f"生成可视化图表失败: {str(e)}")
            return jsonify({'error': f'生成可视化图表失败: {str(e)}'}), 500

    except Exception as e:
        logging.error(f"处理请求时出错: {str(e)}")
        return jsonify({'error': str(e)}), 500


@bp.route('/linear_regression/<int:task_id>', methods=['GET'])
def linear_regression_visualization(task_id):
    """
    生成线性回归的可视化图表
    
    Args:
        task_id: 分析任务ID
        
    Returns:
        dict: 包含所有可视化图表的base64字符串
    """
    try:
        # 获取分析任务
        task = AnalysisService.get_task(task_id)
        if not task:
            return jsonify({'error': '任务不存在'}), 404

        if task.task_type != 'linear_regression':
            return jsonify({'error': '任务类型不是线性回归'}), 400

        # 获取分析结果
        result = task.result
        if not result:
            return jsonify({'error': '分析结果不存在'}), 404

        # 转换数据格式
        y_test = np.array(result['actual_values'])
        y_pred = np.array(result['predictions'])

        # 生成可视化
        visualizations = generate_linear_regression_visualizations(
            y_test=y_test,
            y_pred=y_pred
        )

        return jsonify(visualizations)

    except Exception as e:
        return jsonify({'error': str(e)}), 500
